设计模式--MVC(C++版)
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
- Model(模型)-是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
- View(视图) -是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
- Controller(控制器) - 是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
以C++代码为例,设计英雄(Hero)对战demo。Hero1对Hero2进行攻击,Hero2不断掉血,UI同步更新。
主要三个类,分别为Hero(英雄数据类),HeroView(英雄UI类,如血条)和HeroController(英雄控制器类,Hero管理类)。
Hero类:
1 #pragma once 2 3 class Hero 4 { 5 public: 6 Hero(); 7 ~Hero(); 8 //be attacked 9 void beAttack(int att); 10 //is dead? 11 bool dead() { return m_nHp == 0; } 12 public: 13 //set no 14 void setNo(std::string no) { m_sNo = no; } 15 //get no 16 std::string getNo() { return m_sNo; } 17 18 //set name 19 void setName(std::string name) { m_sName = name; } 20 //get name 21 std::string getName() { return m_sName; } 22 23 //get hp 24 void setHp(int hp) { m_nHp = hp; } 25 //set hp 26 int getHp() { return m_nHp; } 27 28 //set att 29 void setAtt(int att) { m_nAtt = att; } 30 //get att 31 int getAtt() { return m_nAtt; } 32 private: 33 34 std::string m_sName;//姓名 35 std::string m_sNo;//游戏场号码 36 37 int m_nHp;//血量 38 int m_nAtt;//攻击力 39 };
1 #include "stdafx.h" 2 #include "Hero.h" 3 4 //ctor 5 Hero::Hero() 6 { 7 } 8 9 //Destructor 10 Hero::~Hero() 11 { 12 13 } 14 15 void Hero::beAttack(int att) 16 { 17 if (att <= 0) throw "Att Number <= 0";//safe check 18 m_nHp -= att; 19 m_nHp = m_nHp < 0 ? 0 : m_nHp;//safe check 20 }
HeroView类:
1 #pragma once 2 class HeroView 3 { 4 public: 5 HeroView(); 6 ~HeroView(); 7 8 //show hero UI data; 9 void show(string no, string name,int att, int hp); 10 //show hero dead UI; 11 void dead(string no, string name); 12 //show heor winned UI; 13 void winned(string no, string name); 14 private: 15 //Hero* m_hero; 16 };
1 #include "stdafx.h" 2 #include "HeroView.h" 3 4 5 6 HeroView::HeroView() 7 { 8 } 9 10 HeroView::~HeroView() 11 { 12 } 13 14 void HeroView::show(string no,string name, int att, int hp) 15 { 16 cout << "Hero info:"<<"(no:"<<no<<",name:"<<name<<",att:"<<att<<",hp:"<<hp<<")" << endl; 17 } 18 19 void HeroView::dead(string no, string name) 20 { 21 cout << "Hero Dead:" << "(no:" << no << ",name:"<<name << ")" << endl; 22 } 23 24 void HeroView::winned(string no, string name) 25 { 26 cout << "Hero Winned:" << "(no:" << no << ",name:" << name << ")" << endl; 27 28 }
HeroController类:
1 #pragma once 2 class HeroController 3 { 4 public: 5 HeroController(string no, string name); 6 ~HeroController(); 7 void setHeroHp(int hp);//set hero hp 8 void setHeroAtt(int att);//set hero att 9 void show();//show hero info 10 void beAttack(int att);//be attacked by hero 11 void dead();//dead 12 void winned();//winned 13 public : 14 Hero* getHero() { return m_hero; }//get hero 15 16 private: 17 Hero * m_hero;//hero 18 HeroView * m_heroView;//hero view 19 };
1 #include "stdafx.h" 2 #include "HeroController.h" 3 4 5 HeroController::HeroController(string no, string name) 6 { 7 m_heroView = new HeroView(); 8 m_hero = new Hero(); 9 m_hero->setNo(no); 10 m_hero->setName(name); 11 } 12 13 14 HeroController::~HeroController() 15 { 16 } 17 18 19 void HeroController::setHeroHp(int hp) 20 { 21 m_hero->setHp(hp); 22 } 23 24 void HeroController::setHeroAtt(int att) 25 { 26 m_hero->setAtt(att); 27 } 28 29 void HeroController::show() 30 { 31 m_heroView->show(m_hero->getNo(), m_hero->getName(),m_hero->getAtt(), m_hero->getHp()); 32 } 33 34 void HeroController::beAttack(int att) 35 { 36 m_hero->beAttack(att); 37 } 38 39 void HeroController::dead() 40 { 41 m_heroView->dead(m_hero->getNo(),m_hero->getName()); 42 } 43 44 void HeroController::winned() 45 { 46 m_heroView->winned(m_hero->getNo(), m_hero->getName()); 47 }
main() 测试:
1 // ConsoleApplication_C++1.cpp: 主项目文件。 2 3 #include "stdafx.h" 4 5 using namespace System; 6 7 int main() 8 { 9 //初始化一个英雄的控制器 10 HeroController* controller = new HeroController("2017","孟栋"); 11 //设置血量100 12 controller->setHeroHp(100); 13 controller->setHeroAtt(40); 14 //显示一下血量 15 controller->show(); 16 17 //初始化第二个英雄的控制器 18 HeroController* controller2 = new HeroController("2016", "黑魔王"); 19 //设置血量100 20 controller2->setHeroHp(200); 21 //设置攻击力20 22 controller2->setHeroAtt(20); 23 //显示一下血量 24 controller2->show(); 25 26 //hero1 attack hero2 27 controller2->beAttack(controller->getHero()->getAtt()); 28 //ui更新 29 controller2->show(); 30 31 //如果没有dead,就一直攻击 32 while (!controller2->getHero()->dead()) 33 { 34 //hero1 attack hero2 35 controller2->beAttack(controller->getHero()->getAtt()); 36 //ui更新 37 controller2->show(); 38 } 39 40 controller2->dead(); 41 controller->show(); 42 controller->winned(); 43 44 45 46 return 0; 47 }
控制台输出如下:
1 Hero info : (no:2017, name : 孟栋, att : 40, hp : 100) 2 Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 200) 3 Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 160) 4 Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 120) 5 Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 80) 6 Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 40) 7 Hero info : (no : 2016, name : 黑魔王, att : 20, hp : 0) 8 Hero Dead : (no : 2016, name : 黑魔王) 9 Hero info : (no : 2017, name : 孟栋, att : 40, hp : 100) 10 Hero Winned : (no : 2017, name : 孟栋) 11
多加点评,谢谢!